#!/usr/bin/env python3
"""
ExecutionEngine 用户权限管理示例
演示如何通过 DatabaseServerAdapter 使用完整的用户权限功能
"""

from database_server_adapter import DatabaseServerAdapter
from table_schema import Column, ColumnType
from storage_engine import CachePolicy


def demo_user_management_for_execution_engine():
    """
    为 ExecutionEngine 演示完整的用户权限管理功能
    """
    
    print("🎯 ExecutionEngine 用户权限管理示例")
    print("=" * 60)
    
    # 创建数据库适配器
    adapter = DatabaseServerAdapter(
        data_root="./user_mgmt_demo_data",
        cache_size=100,
        cache_policy=CachePolicy.LRU,
        enable_locking=True
    )
    
    try:
        print("🔐 第一步：管理员登录")
        print("-" * 30)
        
        # 1. 管理员登录
        admin_success = adapter.login("root", "root12345")
        if not admin_success:
            print("❌ 管理员登录失败")
            return False
        
        print("✅ 管理员登录成功")
        print(f"当前用户: {adapter.get_current_user()}")
        
        print("\n👥 第二步：用户管理操作")
        print("-" * 30)
        
        # 2. 创建新用户
        print("创建新用户...")
        users_to_create = [
            ("alice", "alice123", "%"),
            ("bob", "bob456", "localhost"),
            ("charlie", "charlie789", "192.168.1.%")
        ]
        
        for username, password, host in users_to_create:
            success = adapter.create_user(username, password, host)
            print(f"  创建用户 {username}@{host}: {'成功' if success else '失败'}")
        
        # 3. 列出所有用户
        print("\n查看所有用户:")
        all_users = adapter.list_users()
        for user in all_users:
            print(f"  - {user.get('username', 'N/A')}@{user.get('host', 'N/A')}")
        
        print(f"系统总用户数: {len(all_users)}")
        
        print("\n🗄️ 第三步：数据库和表管理")
        print("-" * 30)
        
        # 4. 创建测试数据库和表
        print("创建测试数据库...")
        adapter.create_database("company_db")
        adapter.create_database("project_db")
        
        adapter.use_database("company_db")
        
        # 创建员工表
        print("创建员工表...")
        employee_columns = [
            Column("emp_id", ColumnType.INT, primary_key=True),
            Column("name", ColumnType.VARCHAR, length=50),
            Column("department", ColumnType.VARCHAR, length=30),
            Column("salary", ColumnType.FLOAT)
        ]
        adapter.create_table("employees", employee_columns)
        
        # 创建部门表
        print("创建部门表...")
        dept_columns = [
            Column("dept_id", ColumnType.INT, primary_key=True),
            Column("dept_name", ColumnType.VARCHAR, length=30),
            Column("budget", ColumnType.FLOAT)
        ]
        adapter.create_table("departments", dept_columns)
        
        print("\n🔑 第四步：权限管理")
        print("-" * 30)
        
        # 5. 授予不同级别的权限
        print("授予权限...")
        
        # Alice: 对company_db数据库的所有权限
        adapter.grant_privilege("alice", "%", "ALL_PRIVILEGES", database="company_db")
        print("  Alice: company_db 全部权限")
        
        # Bob: 只能查看员工表
        adapter.grant_privilege("bob", "localhost", "SELECT", database="company_db", table="employees")
        print("  Bob: employees表 查询权限")
        
        # Charlie: 可以查询和插入部门表
        adapter.grant_privilege("charlie", "192.168.1.%", "SELECT", database="company_db", table="departments")
        adapter.grant_privilege("charlie", "192.168.1.%", "INSERT", database="company_db", table="departments")
        print("  Charlie: departments表 查询和插入权限")
        
        # 6. 查看用户权限
        print("\n查看用户权限:")
        for username in ["alice", "bob", "charlie"]:
            privileges = adapter.get_user_privileges(username)
            print(f"  {username}的权限: {len(privileges)}条")
            for priv in privileges[:2]:  # 只显示前两条
                database = priv.get('database_name', 'ALL')
                table = priv.get('table_name', 'ALL')
                privilege = priv.get('privilege_type', 'UNKNOWN')
                print(f"    - {privilege} on {database}.{table}")
        
        print("\n🧪 第五步：权限验证测试")
        print("-" * 30)
        
        # 先插入一些测试数据（用管理员权限）
        print("插入测试数据...")
        test_employees = [
            {"emp_id": 1, "name": "张三", "department": "技术部", "salary": 8000.0},
            {"emp_id": 2, "name": "李四", "department": "销售部", "salary": 6000.0},
            {"emp_id": 3, "name": "王五", "department": "人事部", "salary": 5500.0}
        ]
        
        for emp in test_employees:
            adapter.insert_record("employees", emp)
        
        test_departments = [
            {"dept_id": 1, "dept_name": "技术部", "budget": 1000000.0},
            {"dept_id": 2, "dept_name": "销售部", "budget": 800000.0}
        ]
        
        for dept in test_departments:
            adapter.insert_record("departments", dept)
        
        print(f"员工表记录数: {len(adapter.select_records('employees'))}")
        print(f"部门表记录数: {len(adapter.select_records('departments'))}")
        
        # 注销管理员
        adapter.logout()
        
        # 7. 测试Alice的权限（全部权限）
        print("\n测试Alice的权限...")
        alice_success = adapter.login("alice", "alice123")
        if alice_success:
            adapter.use_database("company_db")
            
            # Alice应该能查询
            employees = adapter.select_records("employees")
            print(f"  Alice查询员工: {len(employees)}条记录 ✅")
            
            # Alice应该能插入
            new_emp = {"emp_id": 4, "name": "Alice测试", "department": "技术部", "salary": 9000.0}
            insert_success = adapter.insert_record("employees", new_emp)
            print(f"  Alice插入员工: {'成功' if insert_success else '失败'} ✅")
            
            # Alice应该能更新
            update_count = adapter.update_records("employees", {"emp_id": 4}, {"salary": 9500.0})
            print(f"  Alice更新员工: {update_count}条记录 ✅")
            
            # Alice应该能删除
            delete_count = adapter.delete_records("employees", {"emp_id": 4})
            print(f"  Alice删除员工: {delete_count}条记录 ✅")
            
            adapter.logout()
        
        # 8. 测试Bob的权限（只能查询员工表）
        print("\n测试Bob的权限...")
        bob_success = adapter.login("bob", "bob456", "localhost")
        if bob_success:
            adapter.use_database("company_db")
            
            # Bob应该能查询员工表
            employees = adapter.select_records("employees")
            print(f"  Bob查询员工: {len(employees)}条记录 ✅")
            
            # Bob不应该能查询部门表（会被权限系统阻止）
            try:
                departments = adapter.select_records("departments")
                print(f"  Bob查询部门: {len(departments)}条记录 (可能被允许)")
            except Exception as e:
                print(f"  Bob查询部门: 权限不足 ✅")
            
            # Bob不应该能插入
            new_emp = {"emp_id": 5, "name": "Bob测试", "department": "技术部", "salary": 7000.0}
            insert_success = adapter.insert_record("employees", new_emp)
            print(f"  Bob插入员工: {'权限不足' if not insert_success else '异常通过'}")
            
            adapter.logout()
        
        print("\n📊 第六步：系统统计")
        print("-" * 30)
        
        # 重新用管理员登录查看统计
        adapter.login("root", "root12345")
        
        # 系统统计
        print("系统统计信息:")
        print(f"  数据库数量: {len(adapter.list_databases())}")
        print(f"  用户数量: {len(adapter.list_users())}")
        
        adapter.use_database("company_db")
        print(f"  当前数据库表数量: {len(adapter.list_tables())}")
        
        # 获取当前用户的权限
        admin_privileges = adapter.get_user_privileges()
        print(f"  管理员权限数量: {len(admin_privileges)}")
        
        return True
        
    except Exception as e:
        print(f"❌ 演示过程中发生错误: {e}")
        return False
    finally:
        print("\n🔚 清理资源...")
        adapter.close()


def demo_execution_engine_integration_with_permissions():
    """
    演示ExecutionEngine如何集成用户权限功能
    """
    print("\n" + "=" * 60)
    print("🚀 ExecutionEngine 权限集成示例")
    print("=" * 60)
    
    adapter = DatabaseServerAdapter(data_root="./execution_engine_demo")
    
    try:
        # ExecutionEngine的典型使用模式
        print("1️⃣ ExecutionEngine 初始化和认证")
        
        # 第一步：尝试用普通用户连接
        user_success = adapter.login("alice", "alice123")
        if user_success:
            print("✅ 普通用户Alice登录成功")
            
            # 第二步：尝试执行需要权限的操作
            print("\n2️⃣ 执行数据库操作")
            
            # 查看用户可访问的数据库
            accessible_dbs = adapter.get_accessible_databases()
            print(f"用户可访问的数据库: {accessible_dbs}")
            
            # 选择数据库
            if accessible_dbs:
                adapter.use_database(accessible_dbs[0])
                print(f"切换到数据库: {accessible_dbs[0]}")
                
                # 获取表列表
                tables = adapter.list_tables()
                print(f"数据库中的表: {tables}")
            
            # 第三步：权限检查示例
            print("\n3️⃣ 权限验证")
            current_user = adapter.get_current_user()
            is_authenticated = adapter.is_user_authenticated()
            
            print(f"当前用户: {current_user}")
            print(f"认证状态: {'已认证' if is_authenticated else '未认证'}")
            
            # 获取用户权限
            user_privileges = adapter.get_user_privileges()
            print(f"用户权限数量: {len(user_privileges)}")
            
        else:
            print("❌ 用户登录失败")
        
        print("\n4️⃣ ExecutionEngine 集成要点")
        print("   ✅ 在任何数据库操作前先调用login()")
        print("   ✅ 使用get_accessible_databases()获取可用数据库")
        print("   ✅ 使用is_user_authenticated()检查认证状态")
        print("   ✅ 使用get_user_privileges()获取权限信息")
        print("   ✅ 所有CRUD操作自动进行权限检查")
        print("   ✅ 操作完成后调用logout()或close()")
        
    except Exception as e:
        print(f"❌ 集成演示失败: {e}")
    finally:
        adapter.close()


if __name__ == "__main__":
    print("🎯 ExecutionEngine 用户权限管理完整演示")
    print("=" * 70)
    
    # 运行完整的用户管理演示
    success = demo_user_management_for_execution_engine()
    
    if success:
        # 运行ExecutionEngine集成演示
        demo_execution_engine_integration_with_permissions()
    
    print("\n" + "=" * 70)
    print("📋 总结")
    print("=" * 70)
    
    if success:
        print("🎉 用户权限管理演示成功！")
        print("\n💡 ExecutionEngine 只需要:")
        print("   1. 创建 DatabaseServerAdapter 实例")
        print("   2. 调用 adapter.login(username, password) 认证")
        print("   3. 使用所有现有的CRUD接口（权限自动检查）")
        print("   4. 可选使用用户管理接口（需要管理员权限）")
        print("   5. 最后调用 adapter.logout() 或 adapter.close()")
        print("\n🔐 权限功能:")
        print("   ✅ 完整的用户认证和权限控制")
        print("   ✅ 数据库级和表级权限管理")
        print("   ✅ 自动的权限检查和安全保护")
        print("   ✅ 灵活的权限配置和管理")
        print("   ✅ 与现有接口无缝集成")
    else:
        print("❌ 演示过程中出现问题")
    
    print("\n🚀 ExecutionEngine 可以直接使用完整的用户权限功能！")
